其實理想中的規劃應該是要將M, V, C都拆開來講的,
但實際上controller如果沒有view來輔助解釋,其實有一點太抽象,
所以今天會有基本的view來輔助。
我們要做的不僅是po文功能,
而是最基本的CRUD,在rails裡面有很制式的做法告訴我們該怎麼去實作CRUD。
Create: 顧名思義就是新增,比如說我們新增一篇文章,就是屬於create。
Read:可以看的到,就是read。(應該沒辦法想像沒辦法read的網站吧)
Update:更新,是對現有的東西做改變。
Delete:刪除,將現有的東西刪除掉。
仔細想一下,會發現平常在網路上做的基本事情都不脫這四個。
關於Crud的參考資料
http://ihower.tw/rails3/basic.html
http://rails101s.logdown.com/posts/210435
先回顧一下我們現在有什麼:
(屬性: 資料形態)
接著就要開始製造我們的controller啦!
第一步當然是要先有一個post的controller,
rails g controller posts
注意:controller的名稱是用複數 可以參考這裡:
http://guides.rubyonrails.org/action_controller_overview.html#controller-naming-convention
接著你會想到臥草每次作CRUD都要在routes.rb
裡面加一堆東西是不是很麻煩?
不用擔心,因為這些路徑實在太常用了,已經有先賢先烈幫我們解決這問題,
現在只要寫一行就可以解決所有CRUD所需要的路徑了:
resources :posts
可以輸入bundle exec rake routes來看現在有哪些路徑:
Prefix Verb URI Pattern Controller#Action
root GET / home#index
posts GET /posts(.:format) posts#index
POST /posts(.:format) posts#create
new_post GET /posts/new(.:format) posts#new
edit_post GET /posts/:id/edit(.:format) posts#edit
post GET /posts/:id(.:format) posts#show
PATCH /posts/:id(.:format) posts#update
PUT /posts/:id(.:format) posts#update
DELETE /posts/:id(.:format) posts#destroy
除了先前設置的首頁之外,其他就是剛剛產生的posts路徑,我們可以先不用管路徑的事情放心用啦!
(之後可能還是會需要有其他客製化的route,resources堪用,但不能永遠只依靠他。)
這裡把我們要做的action一項一項列出來,而這也是我們開發的順序,稍後就會明白為何這樣編排:
首先我們要做的是show這個action,他裡面包含的是所有的posts
這裡的命名是有一定規則的,當專案越來越大時越會體會到這樣的好處,
不僅是命名有了一致性,找頁面也會變得方便很多,
後面會講到其實可以render跟action不一樣名字的頁面(但我不喜歡這樣)。
class PostsController < ApplicationController
def show
@posts = Post.find(params[:id])
end
end
params[:id]就是我們在瀏覽器網址列上最後方post的id,可以暫時先把這當成大自然的法則。
所以show頁面會找出id == params[:id]的post
接著是陽春的show.html.erb,放的位置是:app/views/posts/
<h1><%= @post.title %></h1>
<p><%= @post.content %></p>
<div class="source">
<p><%= @post.source %></p>
</div>
<div class="note">
<p>
<%= @post.note %>
</p>
</div>
很明顯的發現我們現在沒有任何的post是可以show出來的,
(這裡可以到rails的console去新建一個po文,不過你應該不會想要老是這樣子做)
所以再來我們要新增一個new action
class PostsController < ApplicationController
def show
@posts = Post.find(params[:id])
end
def new
@post = Post.new
end
end
眼尖的人會發現這裡沒有傳入任何參數,也不會實際去新建什麼東西,
如果你也注意到rake routes裡的結果就會發現new的http method是get,
get通常就是拿來讓使用者瀏覽資訊,不會做出更動的。
(這也就是為什麼待會要有一個是post的create)
在新增我們的new頁面之前得先裝一個叫做simple_form的gem。
以及better_errors這個gem除了顧眼睛之外也對debug很有幫助,
不然老是看到紅色一大片就已經氣急攻心了還寫什麼code
create這邊會比較特別一點,
因為會對資料庫做到改變,所以將會遇到strong parameter的問題,
淺顯一點的講,我們必須要設定能夠傳入的欄位,
比如說這裡的post,我們允許能傳入的就是titile, content, note還有source,
所以使用者在客戶端(瀏覽器)是沒辦法改變post的id或創造時間的,
而去限制和建立新資料的方法會長得像下面這樣:
class PostsController < ApplicationController
def show
@posts = Post.find(params[:id])
end
def new
@post = Post.new
end
def create
@post = Post.new(post_params)
end
private
def post_params
params.require(:posts).permit(:title, :content, :note, :source)
end
end
放在private就只有這個class中的action可以呼叫post_params,也是基於安全。
講完strong parameter剛好可以切一個段落,
因為基本CRUD的實作流程較難理解的部分已經做得差不多了,
剩下的action,除了edit和update跟new, create很像之外,
index和destroy其實也很簡單,
這一篇結束後可以構思以及查一下文章看要如何識做這些action,
下一篇簡短給出解答後,會繼續加前端得連結,完成一個最陽春的po文網站。
(這裡的新增po文功能還要做redirect或是render的處理,這些比較細節的東西會放在下一篇說)